package com.nightsoul.springboottest2.domain;

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

/**
 * 可以根据方法名来自动的生产SQL，比如findByUserName 会自动生产一个以 userName 为参数的查询方法，
 * 比如 findAlll 自动会查询表里面的所有数据，比如自动分页等等
 *
 * 根据方法名称自动生成hql语句：http://www.ityouknow.com/springboot/2016/08/20/springboot(%E4%BA%94)-spring-data-jpa%E7%9A%84%E4%BD%BF%E7%94%A8.html
 *
 * @author zj
 *
 */
public interface UserRepository extends JpaRepository<User, Long> {

	User findByUsername(String username);

	User findByUsernameOrEmail(String username, String email);

	Long deleteById(Long id);

	Long countByUsername(String username);

	User findByUsernameIgnoreCase(String username);

	List<User> findByUsernameOrderByEmailDesc(String email);


	/**
	 * spring data jpa已经帮我们实现了分页的功能，在查询的方法中，需要传入参数Pageable ,
	 * 当查询中有多个参数的时候Pageable建议做为最后一个参数传入
	 */
	Page<User> findAll(Pageable pageable);

	Page<User> findByUsername(String username, Pageable pageable);


	/**
	 * 有时候我们只需要查询前N个元素，或者支取前一个实体。
	 * @return
	 */
	User findFirstByOrderByUsernameAsc();

	User findTopByOrderByEmailDesc();

	Page<User> queryFirst10ByNickName(String nickName, Pageable pageable);

	@Modifying
	@Query("update User u set u.nickName=?1 where u.username=?2")
	@Transactional
	int modifyNickNameByUsername(String nickName, String username);
}
